package com.xrh.tank;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.List;

import javax.swing.ImageIcon;

/**
 * @author 肖荣辉
 * @function 炮弹类
 * @date 2014-3-4
 */
public class Missile {
	public static final int XSPEED=20;//在X轴上移动的移动速度
	public static final int YSPEED=20;//在Y轴移动的移动速度
	int x,y;
	Tank.Direction dir;  //方向类型直接可以引用Tank类里面的,同一个包下默认,public,protected可以被访问
	private boolean live=true;//表示炮弹活着
	private TankClient tc;
	private boolean good;
	ImageIcon missilePic=new ImageIcon(getClass().getResource("images/zidan.png"));
	public static final int WIDTH=8;//图片
	public static final int HEIGHT=8;//图片高度
	
	public boolean isLive() {
		return live;
	}

	public void setLive(boolean live) {
		this.live = live;
	}

	/**
	 * @param x 炮弹x坐标
	 * @param y 炮弹y坐标
	 * @param dir 坦克的方向
	 */
	public Missile(int x, int y, Tank.Direction dir) {
		this.x = x;
		this.y = y;
		this.dir = dir;
	}
	
	/**
	 * @param x 炮弹x坐标
	 * @param y 炮弹y坐标
	 * @param good 阵营炮弹标识
	 * @param dir    坦克的方向
	 * @param tc	  游戏主窗口的引用
	 */
	public Missile(int x, int y, boolean good,Tank.Direction dir,TankClient tc) {
		this(x, y, dir);
		this.good=good;
		this.tc=tc;
	}
	
	/**
	 * 画出炮弹
	 * @param g 传入画笔的引用
	 */ 
	public void draw(Graphics g){
		if(!live){ //若是子弹死了,就不去画了,同时移除这颗死亡的子弹
			tc.missiles.remove(this);//若当前炮弹死亡,就在TankClient中直接移除当前对象
			return;
		}
		Color c=g.getColor();
		g.drawImage(missilePic.getImage(), x, y, null);//子弹那图片
		g.setColor(c);
		move();
	}
	
	//炮弹根据方向移动
	private void move() {
		switch(dir){
			case U:
				y-=YSPEED;
				break;
			case D:
				y+=YSPEED;
				break;
			case L:
				x-=XSPEED;
				break;
			case R:
				x+=XSPEED;
				break;
			case RU:
				x+=XSPEED;
				y-=YSPEED;
				break;
			case RD:
				x+=XSPEED;
				y+=YSPEED;
				break;
			case LD:
				x-=XSPEED;
				y+=YSPEED;
				break;
			case LU:
				x-=XSPEED;
				y-=YSPEED;
				break;
		}
		//炮弹出了游戏界面就算死亡
		if(x<0||y<0||x>TankClient.GAME_WIDTH||y>TankClient.GAME_HEIGHT){
			live=false;
		}
	}
	
	/**
	 * 
	 * @return 返回炮弹矩形
	 */
	public Rectangle getRect(){
		return new Rectangle(x, y, WIDTH, HEIGHT);
	}
	
	/**
	 * 碰撞检测
	 * @param t 传入坦克的引用
	 * @return 炮弹是否击中坦克
	 */
	public boolean hitTank(Tank t){
		if(this.live&&this.getRect().intersects(t.getRect())&&t.isLive()&&this.good!=t.isGood()){//敌军坦克活着并且碰撞,同时子弹也得活着
			if(t.isGood()){//如果是我军坦克
				t.setLife(t.getLife()-20);//打中一次打20血
				if(t.getLife()<=0){
					t.setLive(false);//生命值为0死亡
				}
			}else{
				t.setLive(false);//打中设置坦克死亡
			}
			this.live=false;//坦克死了,打你的子弹也死亡
			Explode e=new Explode(t.getX(), t.getY(), tc);
			tc.explodes.add(e);//把该爆炸添加进去
			return true;
		}
		return false;
	}
	/**
	 * 碰撞检测
	 * @param tanks 坦克数组
	 * @return 炮弹是否击中坦克数组中的坦克
	 */
	public boolean hitTanks(List<Tank> tanks){
		for(int i=0;i<tanks.size();i++){
			if(hitTank(tanks.get(i))){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 碰撞检测
	 * @param w 墙体的引用
	 * @return 炮弹是否击中墙体 
	 */
	public boolean hitWall(Wall w){
		if(this.live&&this.getRect().intersects(w.getRect())){
			this.live=false;//若该子弹撞墙了,则子弹死亡
			return true;
		}
		return false;
	}
}
